home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_300 / 399_01 / mined2.c < prev    next >
C/C++ Source or Header  |  1993-08-03  |  58KB  |  2,339 lines

  1. /*  ==================================================================    *
  2.  *                Editor mined                *
  3.  *                Part 2                    *
  4.  *  ==================================================================    */
  5.  
  6. #include "mined.h"
  7.  
  8. /*  ==================================================================    *
  9.  *            Definitions specific for mined2.c        *
  10.  *  ==================================================================    */
  11.  
  12. #ifndef copycommand
  13. # ifdef vms
  14. # define copycommand "copy %s %s"
  15. # endif
  16. # ifdef msdos
  17. # define copycommand "copy %s %s > nul:"
  18. # endif
  19. #endif
  20.  
  21. /*
  22.  * viewonlyerr () outputs an error message with a beep
  23.  */
  24. void
  25. viewonlyerr ()
  26. {
  27.   ring_bell ();
  28.   error ("View only mode", NIL_PTR);
  29. }
  30.  
  31. FLAG yank_status = NOT_VALID;        /* Status of yank_file */
  32.  
  33. /*  ==================================================================    *
  34.  *                Forward declarations            *
  35.  *  ==================================================================    */
  36.  
  37. FLAG delete_text ();
  38. void file_insert ();
  39. void search ();
  40. void re_search ();
  41. void prev_search ();
  42. void search_for ();
  43. void yank ();
  44. FLAG compile ();
  45. int reverse_scroll ();
  46. int find_y ();
  47. int forward_scroll ();
  48. int insert ();
  49. int legal ();
  50. int line_check ();
  51. int check_string ();
  52. int in_list ();
  53. int star ();
  54. FLAG checkmark ();
  55.  
  56. /*  ==================================================================    *
  57.  *                Move Commands                *
  58.  *  ==================================================================    */
  59.  
  60. /*
  61.  * Move one line up.
  62.  */
  63. void
  64. MUP ()
  65. {
  66.   if (hop_flag > 0) HIGH ();
  67.   else if (y == 0) {        /* Top line of screen. Scroll one line */
  68.     if (reverse_scroll (TRUE) != ERRORS) {
  69.         move_y (y);
  70.     }
  71.   }
  72.   else            /* Move to previous line */
  73.     move_y (y - 1);
  74. }
  75.  
  76. /*
  77.  * Move one line down.
  78.  */
  79. void
  80. MDN ()
  81. {
  82.   if (hop_flag > 0) LOW ();
  83.   else if (y == last_y) {    /* Last line of screen. Scroll one line */
  84.     if (bot_line->next == tail && bot_line->text [0] != '\n') {
  85.     /*    dummy_line ();    don't create new empty line ! */
  86.     /*    MDN (); */
  87.         return;
  88.     }
  89.     else {
  90.         (void) forward_scroll (TRUE);
  91.         move_y (y);
  92.     }
  93.   }
  94.   else            /* Move to next line */
  95.     move_y (y + 1);
  96. }
  97.  
  98. /*
  99.  * Move left one position.
  100.  */
  101. void
  102. MLF ()
  103. {
  104.   if (hop_flag > 0) BLINE ();
  105.   else if (x == 0 && get_shift (cur_line->shift_count) == 0) {/* Begin of line */
  106.     if (cur_line->prev != header) {
  107.         MUP ();                    /* Move one line up */
  108.         move_to (LINE_END, y);
  109.     }
  110.   }
  111.   else
  112.     move_to (x - 1, y);
  113. }
  114.  
  115. /*
  116.  * Move right one position.
  117.  */
  118. void
  119. MRT ()
  120. {
  121.   if (hop_flag > 0) ELINE ();
  122.   else if (* cur_text == '\n') {
  123.     if (cur_line->next != tail) {        /* Last char of file */
  124.         MDN ();                /* Move one line down */
  125.         move_to (LINE_START, y);
  126.     }
  127.   }
  128.   else
  129.     move_to (x + 1, y);
  130. }
  131.  
  132. /*
  133.  * Move to top of screen
  134.  */
  135. void
  136. HIGH ()
  137. {
  138.   move_y (0);
  139. }
  140.  
  141. /*
  142.  * Move to bottom of screen
  143.  */
  144. void
  145. LOW ()
  146. {
  147.   move_y (last_y);
  148. }
  149.  
  150. /*
  151.  * Move to begin of line.
  152.  */
  153. void
  154. BLINE ()
  155. {
  156.   move_to (LINE_START, y);
  157. }
  158.  
  159. /*
  160.  * Move to end of line.
  161.  */
  162. void
  163. ELINE ()
  164. {
  165.   move_to (LINE_END, y);
  166. }
  167.  
  168. /*
  169.  * GOTO () prompts for a linenumber and moves to that line.
  170.  */
  171. void
  172. goline (number)
  173.   int number;
  174. {
  175.   LINE * line;
  176.   if (number <= 0 || (line = proceed (header->next, number - 1)) == tail)
  177.     error ("Illegal line number: ", num_out ((long) number));
  178.   else    {
  179.       clear_status ();
  180.       move_y (find_y (line));
  181.     }
  182. }
  183.  
  184. void
  185. goproz (number)
  186.   int number;
  187. {
  188.   goline (number * total_lines / 100);
  189. }
  190.  
  191. void
  192. GOTO ()
  193. {
  194.   uchar c;
  195.   char end;
  196.   int number;
  197.  
  198.   if (! char_ready_within (500)) status_msg ("HOP ... command (fortified) or line number...");
  199.   if (quit == TRUE) return;
  200.   c = readchar ();
  201.   if (quit == TRUE) return;
  202.   if ('0' <= c && c <= '9') {
  203.     end = get_number ("Please continue line number...", c, & number);
  204.     if (end == '%')
  205.         goproz (number);
  206.     else if (end != ERRORS)
  207.         goline (number);
  208.     return;
  209.   }
  210.   else {
  211.     clear_status ();
  212.     hop_flag = 1;
  213.     (* key_map [c]) (c);
  214.     return;
  215.   }
  216. }
  217.  
  218. /*
  219.  * Scroll forward one page or to eof, whatever comes first. (Bot_line becomes
  220.  * top_line of display.) Try to leave the cursor on the same line. If this is
  221.  * not possible, leave cursor on the line halfway the page.
  222.  */
  223. void
  224. PD ()
  225. {
  226.   register int i;
  227.   int new_y;
  228.  
  229.   if (hop_flag > 0) {hop_flag = 0; EFILE (); return;}
  230.  
  231.   for (i = 0; i < SCREENMAX; i ++)
  232.     if (forward_scroll (page_scroll) == ERRORS)
  233.         break;            /* EOF reached */
  234.  
  235.   if (y - i < 0)            /* Line no longer on screen */
  236.     new_y = (page_stay == TRUE) ? 0 : SCREENMAX >> 1;
  237.   else    new_y = y - i;
  238.  
  239.   if (page_scroll == FALSE) display (0, top_line, last_y, new_y);
  240.  
  241.   move_y (new_y);
  242. }
  243.  
  244. /*
  245.  * Scroll backwards one page or to top of file, whatever comes first.
  246.  * (Top_line becomes bot_line of display).
  247.  * The very bottom line (YMAX) is always blank.
  248.  * Try to leave the cursor on the same line.
  249.  * If this is not possible, leave cursor on the line halfway the page.
  250.  */
  251. void
  252. PU ()
  253. {
  254.   register int i;
  255.   int new_y;
  256.  
  257.   if (hop_flag > 0) {hop_flag = 0; BFILE (); return;}
  258.  
  259.   for (i = 0; i < SCREENMAX; i ++) {
  260.     if (reverse_scroll (page_scroll) == ERRORS)
  261.         /* should also flag reverse_scroll that clearing of 
  262.            bottom line is not desired */
  263.         break;            /* Top of file reached */
  264.   }
  265.  
  266.   if (y + i > SCREENMAX)        /* line no longer on screen */
  267.     new_y = (page_stay == TRUE) ? last_y : SCREENMAX >> 1;
  268.   else
  269.     new_y = y + i;
  270.  
  271.   if (can_scroll_reverse == TRUE && page_scroll == TRUE) {
  272.     set_cursor (0, YMAX);    /* Erase very bottom line */
  273.     clear_lastline ();
  274.   }
  275.   else display (0, top_line, last_y, new_y);
  276.  
  277.   move_y (new_y);
  278. }
  279.  
  280. /*
  281.  * Go to top of file, scrolling if possible, else redrawing screen.
  282.  */
  283. void
  284. BFILE ()
  285. {
  286.   if (proceed (top_line, - SCREENMAX) == header)
  287.     PU ();            /* It fits. Let PU do it */
  288.   else {
  289.     reset (header->next, 0);/* Reset top_line, etc. */
  290.     RD_y (0);        /* Display full page */
  291.   }
  292.   move_to (LINE_START, 0);
  293. }
  294.  
  295. /*
  296.  * Go to last position of text, scrolling if possible, else redrawing screen
  297.  */
  298. void
  299. EFILE ()
  300. {
  301.   /* if (tail->prev->text [0] != '\n') dummy_line (); */
  302.   if (proceed (bot_line, SCREENMAX) == tail)
  303.     PD ();            /* It fits. Let PD do it */
  304.   else {
  305.     reset (proceed (tail->prev, - SCREENMAX), SCREENMAX);
  306.     RD_y (last_y);        /* Display full page */
  307.   }
  308.   move_to (LINE_END /* not START ("EFILE"!) */, last_y);
  309. }
  310.  
  311. /*
  312.  * Scroll one line up. Leave the cursor on the same line (if possible).
  313.  */
  314. void
  315. SU ()
  316. {
  317.   register int i;
  318.  
  319.   if (hop_flag > 0) {
  320.     hop_flag = 0;
  321.     for (i = 0; i < (SCREENMAX >> 1); i ++) SU ();
  322.     return;
  323.   }
  324.  
  325.   if (reverse_scroll (TRUE) != ERRORS) {    /* else we are at top of file */
  326.     move_y ((y == SCREENMAX) ? SCREENMAX : y + 1);
  327.   }
  328. }
  329.  
  330. /*
  331.  * Scroll one line down. Leave the cursor on the same line (if possible).
  332.  */
  333. void
  334. SD ()
  335. {
  336.   register int i;
  337.  
  338.   if (hop_flag > 0) {
  339.     hop_flag = 0;
  340.     for (i = 0; i < (SCREENMAX >> 1); i ++) SD ();
  341.     return;
  342.   }
  343.  
  344.   if (forward_scroll (TRUE) != ERRORS)
  345.     move_y ((y == 0) ? 0 : y - 1);
  346. }
  347.  
  348. /*
  349.  * Perform a forward scroll. It returns ERRORS if we're at the last line of
  350.  * the file.
  351.  */
  352. int
  353. forward_scroll (update)
  354.   FLAG update;
  355. {
  356.   if (bot_line->next == tail)        /* Last line of file. No dice */
  357.     return ERRORS;
  358.   top_line = top_line->next;
  359.   bot_line = bot_line->next;
  360.   cur_line = cur_line->next;
  361.  
  362. /* Perform the scroll on screen */
  363.   if (update == TRUE) {
  364.     scroll_forward ();
  365.     set_cursor (0, SCREENMAX);
  366.     line_print (bot_line);
  367.   }
  368.  
  369.   return FINE;
  370. }
  371.  
  372. /*
  373.  * Perform a backwards scroll. It returns ERRORS if we're at the first line 
  374.  * of the file. It updates the display completely if update is TRUE. 
  375.  * Otherwise it leaves that to the caller (page up function).
  376.  */
  377. int
  378. reverse_scroll (update)
  379.   FLAG update;
  380. {
  381.   if (top_line->prev == header)
  382.     return ERRORS;        /* Top of file. Can't scroll */
  383.  
  384.   if (last_y != SCREENMAX)    /* Reset last_y if necessary */
  385.     last_y ++;
  386.   else
  387.     bot_line = bot_line->prev;    /* Else adjust bot_line */
  388.   top_line = top_line->prev;
  389.   cur_line = cur_line->prev;
  390.  
  391. /* Perform the scroll on screen */
  392.   if (update == TRUE)
  393.     if (can_scroll_reverse == TRUE) {
  394.     set_cursor (0, 0);
  395.     scroll_reverse ();
  396.     set_cursor (0, YMAX);    /* Erase very bottom line */
  397.     clear_lastline ();
  398.     set_cursor (0, 0);
  399.     line_print (top_line);
  400.     }
  401.     else display (0, top_line, last_y, y);
  402.  
  403.   return FINE;
  404. }
  405.  
  406. /*----------------------*
  407.  *    Word moves    *
  408.  *----------------------*/
  409.  
  410. /*
  411.  * A word was previously defined as a number of non-blank charact